UCT たかし先輩のK8s作問

問題名

たかし先輩のK8s作問

問題文

ICT大学に入学したあなたは、高校の先輩であるたかし先輩に誘われてトラブルシューティングコンテスト部に入部しました。

たかし先輩は次のコンテストでネットで話題のKubernetesを使って出題したいらしく、minikubeを使ってKubernetesを構築し勉強用にproblem.yamlだけをapplyしたそうです。
しかし、applyしたproblem.yamlはエラーを出して動作しないそうです。
このままだと作問期日に間に合わせることができないと、あなたに泣きついてきました。

ただ、マニフェストはサンプルをそのまま書き写したはずなのでパラメータを変更しなくても動作するはずだと、たかし先輩は言い張ります。
何とかしてマニフェストが動作しない原因の究明とマニフェストのリソースが正しく動作するようにしてください。

ところで、サンプルマニフェストも動かないのに、たかし先輩は作問できるのでしょうか?

前提条件

  • problem.yaml のパラメータを 追加・変更・削除 してはいけない

初期状態

  • kubectl apply -f problem.yamluser のホームディレクトリで実行してもマニフェストがエラーになる

終了状態

  • kubectl apply -f problem.yaml が成功する
  • problem.yaml で定義したリソースが正しくデプロイ・動作し、http://"minikubeのIP"/apache,http://"minikubeのIP"/nginxにアクセスするとapache/nginxそれぞれのデフォルトページが表示される

問題環境

Ubuntu22.04に対して、minikubeをインストールしただけの状態。
インストールスクリプトproblem.yamlGitHubのリポジトリに用意した。

この状態で、 kubectl apply -f problem.yaml を行う。

解説

概要

YAML1.1では ynなどの値がBooleanとして解釈されるため、安易に一文字変数を使うとリソースが作成できません。
docker composeなどでも怒られます。

また、ベアメタルなKubernetesはマネージドと違ってIngressコントローラーが用意されていないので自分でデプロイする必要があります。

解答

kubectl apply -f problem.yaml を行うと、Ingressが謎のエラーを出します。
エラー文を読むと、 name: trueと出力されているためおそらくBooleanと解釈されていると推測されます。

Ingressの名前yがBoolのtrueと解釈されるため、"y"'y'と書き換える。
パラメータの変更ではなく、書式の変更であるとして前提条件で制限されていないとします。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
- name: y
+ name: 'y'
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /

この状態でリーソースは展開できるが、終了条件のIngressにアクセスはできません。

Minikubeには Ingressのアドオンがあるため、これを有効にします。
自分でNginx Ingressリソースを展開してもよいはずです(problem.yamlのパラメータに影響はないため)

minikube addons enable ingress

採点基準

  • yamlの仕様を理解して修正が適用できている: 50%
  • ingressが使用できる状態にしている: 50%